﻿// client.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

#include "pch.h"
#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
#include <iostream>

int main()
{   // 1.请求协议
	WSADATA wsaData; //这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据
	WSAStartup(MAKEWORD(2, 2), &wsaData);  //客户端请求协议
	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) //用高低字节判断版本是否请求成功 
	{
		printf("请求版本失败!\n");
		return -1;
	}
	printf("请求版本成功!\n");

	//2.创建socket
	SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //参数分别是通信协议的族, 套接字类型(数据流), 制定某个协议的特定类型(TCP保护方式)
	if (serverSocket == INVALID_SOCKET)
	{
		printf("请求端口失败!\n");
		return -1;
	}
	printf("请求端口成功!\n");

	//3.获取协议地址簇  (本质结构体)  ①协议 ②主机-电脑 ③网络端口-应用

	SOCKADDR_IN addr = { 0 };   //初始化结构体为空
	addr.sin_family = AF_INET;//① 地址类型
	addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); // ② inet_addr 将网络地址转换成二进制数字
	addr.sin_port = htons(10087); //③端口号 htons将一个无符号短整型的主机数值转换为网络 字节顺序


	//4.连接服务器
	int r = connect(serverSocket, (sockaddr*)&addr, sizeof addr);
	if (r == -1) {
		printf("连接服务器失败\n!");
		return -1;
	}
	printf("连接服务器成功\n");


	//通信
	char buff[256]; //创建buff数组继续数据
	while (1) {
		memset(buff, 0, 256); //每次循环清空数组
		printf("你想要发送什么:\n");
		scanf("%s", buff);
		r = send(serverSocket, buff, strlen(buff), NULL);
		if (r > 0) {
			printf("发送%d字节到服务器成功\n", r);
		}
	}
}